SnowflakeのRESULT_SCAN関数を使ってみた
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
Snowflakeのテーブル関数の1つにRESULT_SCAN
という関数があります。この関数が結構便利そうだったので今回試してみました。
RESULT_SCAN関数とは?
RESULT_SCAN関数は、以前に実行したコマンドの結果を「結果セット」として返してくれる関数です。
例えばSHOW REGIONS
コマンドですが、このコマンドはSHOW
系のコマンドなので細かい結果の制御はできません。
これに対して、RESULT_SCAN関数を併用すると、WHERE句での絞り込みや、ORDER BYでの並び替えができるようになります。なお、注意点としてRESULT_SCAN関数を利用したクエリ実行には仮想ウェアハウスを必要とするので、その点には注意が必要です。
試してみた
ということで、具体的にどのように使うのかRESULT_SCAN関数を試してみました。今回はSHOW REGIONS
コマンドと併用して色々試してみます。
RESULT_SCAN関数の構文は以下の通り、クエリIDを明示的に指定するか、LAST_QUERY_ID()
を利用してクエリIDを取得するかのどちらかになります。今回はLAST_QUERY_ID()
を利用してみます。
RESULT_SCAN ( { '<query_id>' | LAST_QUERY_ID() } )
まずは単純にSHOW REGIONS
コマンドの実行結果の確認です。
SHOW REGIONS;
╒═════════════════════╤═══════╤════════════════╕ │ snowflake_region │ cloud │ region │ ╞═════════════════════╪═══════╪════════════════╡ │ AWS_US_WEST_2 │ aws │ us-west-2 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_US_EAST_1 │ aws │ us-east-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTHEAST_2 │ aws │ ap-southeast-2 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_EU_WEST_1 │ aws │ eu-west-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTHEAST_1 │ aws │ ap-southeast-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_CA_CENTRAL_1 │ aws │ ca-central-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_EU_CENTRAL_1 │ aws │ eu-central-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_US_EAST_2 │ aws │ us-east-2 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_AP_NORTHEAST_1 │ aws │ ap-northeast-1 │ ├─────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTH_1 │ aws │ ap-south-1 │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_EASTUS2 │ azure │ eastus2 │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_WESTEUROPE │ azure │ westeurope │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_AUSTRALIAEAST │ azure │ australiaeast │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_CANADACENTRAL │ azure │ canadacentral │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_SOUTHEASTASIA │ azure │ southeastasia │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_WESTUS2 │ azure │ westus2 │ ├─────────────────────┼───────┼────────────────┤ │ AZURE_SWITZERLANDN │ azure │ switzerlandn │ ├─────────────────────┼───────┼────────────────┤ │ GCP_US_CENTRAL1 │ gcp │ us-central1 │ ├─────────────────────┼───────┼────────────────┤ │ GCP_EUROPE_WEST2 │ gcp │ europe-west2 │ ├─────────────────────┼───────┼────────────────┤ │ GCP_EUROPE_WEST4 │ gcp │ europe-west4 │ ╘═════════════════════╧═══════╧════════════════╛
ここで、cloud
がaws
のものに限定するように、RESULT_SCAN関数を使ってクエリを掛けてみます。
SELECT "snowflake_region", "cloud", "region" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "cloud" = 'aws' ;
FROM句の箇所でRESULT_SCAN関数を利用しています。また、更にTABLE関数を利用してRESULT_SCANの結果を行のセットとして利用しています。なお、カラム名の定義が小文字なので、カラム名はダブルクォーテーションで括っています。
結果は以下の通りとなり、ちゃんと絞り込みできていますね。
╒════════════════════╤═══════╤════════════════╕ │ snowflake_region │ cloud │ region │ ╞════════════════════╪═══════╪════════════════╡ │ AWS_US_WEST_2 │ aws │ us-west-2 │ ├────────────────────┼───────┼────────────────┤ │ AWS_US_EAST_1 │ aws │ us-east-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTHEAST_2 │ aws │ ap-southeast-2 │ ├────────────────────┼───────┼────────────────┤ │ AWS_EU_WEST_1 │ aws │ eu-west-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTHEAST_1 │ aws │ ap-southeast-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_CA_CENTRAL_1 │ aws │ ca-central-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_EU_CENTRAL_1 │ aws │ eu-central-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_US_EAST_2 │ aws │ us-east-2 │ ├────────────────────┼───────┼────────────────┤ │ AWS_AP_NORTHEAST_1 │ aws │ ap-northeast-1 │ ├────────────────────┼───────┼────────────────┤ │ AWS_AP_SOUTH_1 │ aws │ ap-south-1 │ ╘════════════════════╧═══════╧════════════════╛
今度は、cloud
をgcp
のものに限定した上で、region
順で並び替えます。LAST_QUERY_ID()
を利用するので、先に再度SHOW REGIONS
を実行してからSELECTします。
SHOW REGIONS;
SELECT "snowflake_region", "cloud", "region" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "cloud" = 'gcp' ORDER BY "region" ;
以下の結果となりました。バッチリですね!
╒══════════════════╤═══════╤══════════════╕ │ snowflake_region │ cloud │ region │ ╞══════════════════╪═══════╪══════════════╡ │ GCP_EUROPE_WEST2 │ gcp │ europe-west2 │ ├──────────────────┼───────┼──────────────┤ │ GCP_EUROPE_WEST4 │ gcp │ europe-west4 │ ├──────────────────┼───────┼──────────────┤ │ GCP_US_CENTRAL1 │ gcp │ us-central1 │ ╘══════════════════╧═══════╧══════════════╛
まとめ
以上、RESULT_SCAN関数を試してみました。SHOW系のコマンドの結果を細かく制御して取得したり、別のクエリのデータソースとしたい場合にとても便利ですね。
どなたかのお役に立てば幸いです。それでは!